home *** CD-ROM | disk | FTP | other *** search
/ Aminet 41 / Aminet 41 (2001)(Schatztruhe)[!][Feb 2001].iso / Aminet / comm / tcp / rxsocket.lha / rxsocket / examples / CheckMail.amirx < prev    next >
Text File  |  2000-11-28  |  5KB  |  198 lines

  1. /* CheckMail.rexx */
  2.  
  3. global.prg="CheckMail"
  4.  
  5. l="rmh.library";if ~show("L",l) then;if ~addlib(l,0,-30) then call err("can't find rmh.library")
  6. if AddLibrary("rexxsupport.library","rxsocket.library")~=0 then call err("can't find" l)
  7.  
  8. /*******YOU HAVE TO SET THESE!!!*******/
  9. host =                "YOUR POP HOST NAME"
  10. port =                110 /* OR YOUR POP HOST PORT*/
  11. login=                "YOUR LOGIN"
  12. pass=                 "YOU PASSWORD"
  13.  
  14. /*******YOU MAY SET THESE*******/
  15. timeout            = 120
  16. global.normalColor = 3
  17. global.mailColor   = 4
  18.  
  19. global.color=global.normalColor
  20.  
  21. signal on break_c
  22. global.amirc=left(address(),6)=="AMIRC."
  23. global.prg=ProgramName("NOEXT")
  24.  
  25. global.portName=upper(global.prg)
  26. if show("P",global.portName) then do
  27.     msg="address" global.portName "QUIT"
  28.     p=global.prg
  29.     global.prg="B"p
  30.     call info "signalled" p "to exit."
  31.     interpret msg
  32.     exit
  33. end
  34.  
  35. template="HOST/K,LOGIN/K,PASSWORD=PASS/K,PORT/K/N,TIMEOUT=TOUT/K/N,COLOR/K/N,MAILCOLOR/K/N,HELP/S"
  36. parse arg args
  37. if args=="?" & global.amirc then call err template
  38.  
  39. if ~RMH_ReadArgs(template) then call err Fault(IoErr(),global.prg)
  40.  
  41. if parm.0.flag then host=parm.0.value
  42. if parm.1.flag then login=parm.1.value
  43. if parm.2.flag then pass=parm.2.value
  44. if parm.3.flag then port=parm.3.value
  45. if parm.4.flag then timeout=parm.4.value
  46. if parm.5.flag then global.normalColor=parm.5.value
  47. if parm.6.flag then global.mailColor=parm.6.value
  48. global.color=global.normalColor
  49. if parm.7.flag then call help
  50.  
  51. if port=-1 then
  52.     if ~GetServByName("S","pop3","tcp") then port=se.ServPort
  53.     else sin.AddrPort=110
  54. if port<1 | port>65535 then call err "must be 1<=PORT<=65535"
  55. if timeout<0 then call err "TIMEOUT must be non negative"
  56.  
  57. if ~OpenPort(global.portName) then call err "can't open my port"
  58. global.ps=PortSignal(global.portName)
  59.  
  60. if timeout~=0 then do
  61.     global.time=CreateTimer()
  62.     global.ts=TimerSignal(global.time)
  63.     call StartTimer(global.time,timeout)
  64. end
  65. else global.ts=0
  66.  
  67. global.ctrlc=2**12
  68. global.sigbreak=or(global.ctrlc,global.ts,global.ps)
  69. call SetSocketSignals(global.sigbreak)
  70.  
  71. call info "resolving host address..."
  72. remote.AddrAddr=resolve(host)
  73. if remote.AddrAddr==-1 then
  74.     if emptyPort() | CheckSignal(global.ctrlc) then call break_c
  75.     else if CheckSignal(global.ts) then call err "timeout"
  76.          else call err "host <"host"> not found"
  77.  
  78. global.sock=socket("INET","STREAM")
  79. if global.sock<0 then call err "can't create socket"
  80.  
  81. global.sigio=2**AllocSignal()
  82. call SetSocketSignals(global.sigbreak,global.sigio)
  83.  
  84. call IOCtlSocket(global.sock,"FIONBIO",1)
  85. call IoctlSocket(global.sock,"FIOASYNC",1)
  86. call SetSockOpt(global.sock,"SOCKET","EVENTMASK","CONNECT READ WRITE ERROR")
  87. global.mask=or(global.sigbreak,global.sigio)
  88.  
  89. remote.AddrPort=port
  90. call info "connecting..."
  91. res=connect(global.sock,"REMOTE")
  92. call waitev("CONNECT")
  93.  
  94. call info "loggin in..."
  95. call waitev("READ")
  96. call rec
  97.  
  98. call sen("USER alfier")
  99.  
  100. call waitev("READ")
  101. call rec
  102.  
  103. call sen("PASS spognardi")
  104.  
  105. call waitev("READ")
  106. call rec
  107.  
  108. call info "getting statistics..."
  109. call sen("STAT")
  110.  
  111. call waitev("READ")
  112. stat=rec()
  113.  
  114. num=word(stat,2)
  115. if num>0 then do
  116.     global.color=global.mailColor
  117.     msg="you have" num "new mail(s) for total" word(stat,3) "bytes."
  118. end
  119. else msg="you have no new mail."
  120. call info msg
  121.  
  122. call sen("QUIT")
  123. exit
  124.  
  125. rec: procedure expose global.
  126.     len=RecvFromUntil(global.sock,"B",256,"D0A"x)
  127.     if len<1 then call err "error reading",1
  128.     if word(b,1)=="-ERR" then call err right(b,length(b)-wordindex(b,2)+1) "(server error)"
  129.     return b
  130.  
  131. sen: procedure expose global.
  132. parse arg string
  133.     string=string"D0A"x
  134.     res=send(global.sock,string)
  135.     if res~=length(string) then call err "error sending",1
  136.     return
  137.  
  138. waitev: procedure expose global. events.
  139. parse arg ev
  140.     do forever
  141.         sigrec=Wait(global.mask)
  142.         if emptyPort() | and(sigrec,global.ctrlc)~=0 then call break_c
  143.         else if and(sigrec,global.ts)~=0 then call err "timeout"
  144.         s=GetSocketEvents("EVENTS")
  145.         if s>=0 then do
  146.             if events.error then call err "error",1
  147.             if events.ev then return
  148.         end
  149.     end
  150.     return
  151.  
  152. info: procedure expose global.
  153. parse arg msg
  154.     if msg=="" then msg="F"x
  155.     if global.amirc then "ECHO P="d2c(27)"b«"global.prg"» C="global.color msg
  156.     else say msg
  157.     return
  158.  
  159. err: procedure expose global.
  160. parse arg msg,err
  161.     if ~global.amirc then msg=global.prg":" msg
  162.     if err==1 then
  163.         if IsLibOn("TTCP") then more=" (error "errno()")."
  164.         else more=" ("ErrorString(errno())")."
  165.     else more="."
  166.     call info msg || more
  167.     exit
  168.  
  169. break_c: procedure expose global.
  170.     call err "user break detected"
  171.  
  172. emptyPort: procedure expose global.
  173.     res=0
  174.     pkt=GetPkt(global.portName)
  175.     do while pkt~=null()
  176.         call reply(pkt)
  177.         res=1
  178.         pkt=GetPkt(global.portName)
  179.     end
  180.     return res~=0
  181.  
  182. help: procedure expose global.
  183.     call info "CheckMail 3.16 (20-Oct-1998) by alfie"
  184.     call info ""
  185.     call info "HOST/K                    the pop3 host addr to connect"
  186.     call info "LOGIN/K                   the user name"
  187.     call info "PASSWORD=PASS/K           the password"
  188.     call info "PORT/K/N,TIMEOUT=TOUT/K/N global timeout - 0 means none"
  189.     call info "COLOR/K/N                 normal text Amirc color number"
  190.     global.color=global.mailColor
  191.     call info "MAILCOLOR/K/N             new-mail text Amirc color number"
  192.     global.color=global.normalColor
  193.     call info "HELP/S                    show this."
  194.     call info ""
  195.     exit
  196.  
  197. /*$VER: CheckMail.rexx 3.17 (5.7.99)*/
  198.